package com.kaifamiao.month03.day0316;

import java.util.Arrays;

/**
 * 能够存储多个元素
 * 能够自动进行扩容(阈值为`0.75`，每次扩容 1.5 倍 )
 * 能够删除元素，删除成功后将删除的元素返回
 * 能够添加元素（默认添加到末尾）
 * 获取某个元素的位置（索引/下标）
 * 能够通过下标获取该位置的元素
 * 能够获取元素的个数
 * 以字符串的形式显示内容
 */
public class ArrayListForCookies {

    Cookies[] cs = new Cookies[10];
    int count = 0;
    final double threshold = 0.75;
    final double growth = 1.5;

    /**
     * 扩容，阈值为 0.75 ，每次扩容 1.5 倍
     */
    public void grow(){
        if(count >= cs.length * threshold ){
            cs = Arrays.copyOf(cs,(int) Math.round(cs.length * growth));
        }
    }
    /**
     * 删除指定位置的元素
     * @param index 需要删除元素的下标
     * @return 删除的元素内容
     */
    public Cookies remove(int index){
        checkIndex(index);
        Cookies user = indexOf(index);
        System.arraycopy(cs,index + 1,cs,index,cs.length - index - 1);
        cs[count - 1] = null;
        count --;
        return user;
    }

    /**
     * 检查下标是否正常
     * @param index 下标
     */
    public void checkIndex(int index){
        if(index < 0 || index >= count){
            throw new RuntimeException("下标异常：" + index);
        }
    }

    /**
     * 查找指定位置元素
     * @param index 需要查找的元素的位置
     * @return 该位置的元素
     */
    public Cookies indexOf(int index){
        checkIndex(index);
        return cs[index];
    }

    /**
     * 给指定位置添加元素
     * @param index 需要添加元素的位置
     * @param object 需要添加的元素内容
     */
    public void add(int index,Cookies object){
        checkIndex(index);
        grow();
        System.arraycopy(cs,index,cs,index + 1,cs.length - index - 1);
        cs[index] = object;
        count ++;
    }

    /**
     * 默认给末尾添加元素
     * @param object 需要添加的元素
     */
    public void add(Cookies object){
        cs[count] = object;
        count ++;
    }

    /**
     * 获取某个元素的位置
     * @param object 需要查找的元素
     * @return 该元素所在的位置
     */
    public int index(Cookies object){
        for(int i = 0; i < cs.length; i ++){
            if(object.equals(cs[i])){
                return i;
            }
        }
        return -1; // 未找到返回 -1
    }

    /**
     * 统计元素的数量
     * @return 元素的数量
     */
    public int count(){
        return count;
    }

    /**
     * 转换成字符串
     * @return 转换之后的字符串
     */
    public String convert(){
        return Arrays.toString(Arrays.copyOf(cs,count));
    }

}
